/*
 *	DEMO HELPERS
 */


/**
 *    debugData
 *
 *    Pass me a data structure {} and I'll output all the key/value pairs - recursively
 *
 *    @example var HTML = debugData( oElem.style, "Element.style", { keys: "top,left,width,height", recurse: true, sort: true, display: true, returnHTML: true });
 *
 *    @param Object    o_Data   A JSON-style data structure
 *    @param String    s_Title  Title for dialog (optional)
 *    @param Hash        options  Pass additional options in a hash
 */
function debugData(o_Data, s_Title, options) {
    options = options || {};
    var
        str = s_Title || 'DATA'
        //	maintain backward compatibility with OLD 'recurseData' param
        , recurse = (typeof options == 'boolean' ? options : options.recurse !== false)
        , keys = (options.keys ? ',' + options.keys + ',' : false)
        , display = options.display !== false
        , html = options.returnHTML !== false
        , sort = options.sort !== false
        , D = [], i = 0 // Array to hold data, i=counter
        , hasSubKeys = false
        , k, t, skip, x    // loop vars
        ;
    if (o_Data.jquery) {
        str = (s_Title ? s_Title + '\n' : '') + 'jQuery Collection (' + o_Data.length + ')\n    context="' + o_Data.context + '"';
    }
    else if (o_Data.tagName && typeof o_Data.style == 'object') {
        str = (s_Title ? s_Title + '\n' : '') + o_Data.tagName;
        var id = o_Data.id, cls = o_Data.className, src = o_Data.src, hrf = o_Data.href;
        if (id)  str += '\n    id="' + id + '"';
        if (cls) str += '\n    class="' + cls + '"';
        if (src) str += '\n    src="' + src + '"';
        if (hrf) str += '\n    href="' + hrf + '"';
    }
    else {
        parse(o_Data, ''); // recursive parsing
        if (sort && !hasSubKeys) D.sort(); // sort by keyName - but NOT if has subKeys!
        str += '\n***' + '****************************'.substr(0, str.length);
        str += '\n' + D.join('\n'); // add line-breaks
    }

    if (display) alert(str); // display data
    if (html) str = str.replace(/\n/g, ' <br>').replace(/  /g, ' &nbsp;'); // format as HTML
    return str;

    function parse(data, prefix) {
        if (typeof prefix == 'undefined') prefix = '';
        try {
            $.each(data, function (key, val) {
                k = prefix + key + ':  ';
                skip = (keys && keys.indexOf(',' + key + ',') == -1);
                if (typeof val == 'function') { // FUNCTION
                    if (!skip) D[i++] = k + 'function()';
                }
                else if (typeof val == 'string') { // STRING
                    if (!skip) D[i++] = k + '"' + val + '"';
                }
                else if (typeof val != 'object') { // NUMBER or BOOLEAN
                    if (!skip) D[i++] = k + val;
                }
                else if (isArray(val)) { // ARRAY
                    if (!skip) D[i++] = k + '[ ' + val.toString() + ' ]'; // output delimited array
                }
                else if (val.jquery) {
                    if (!skip) D[i++] = k + 'jQuery (' + val.length + ') context="' + val.context + '"';
                }
                else if (val.tagName && typeof val.style == 'object') {
                    var id = val.id, cls = val.className, src = val.src, hrf = val.href;
                    if (skip) D[i++] = k + ' ' +
                        id ? 'id="' + id + '"' :
                        src ? 'src="' + src + '"' :
                            hrf ? 'href="' + hrf + '"' :
                                cls ? 'class="' + cls + '"' :
                                    '';
                }
                else { // Object or JSON
                    if (!recurse || !hasKeys(val)) { // show an empty hash
                        if (!skip) D[i++] = k + '{ }';
                    }
                    else { // recurse into JSON hash - indent output
                        D[i++] = k + '{';
                        parse(val, prefix + '    '); // RECURSE
                        D[i++] = prefix + '}';
                    }
                }
            });
        } catch (e) {
        }
        function isArray(o) {
            return (o && typeof o === 'object' && !o.propertyIsEnumerable('length') && typeof o.length === 'number');
        }

        function hasKeys(o) {
            var c = 0;
            for (x in o) c++;
            if (!hasSubKeys) hasSubKeys = !!c;
            return !!c;
        }
    }
}
;


/**
 * showOptions
 *
 * Pass a layout-options object, and the pane/key you want to display
 */
function showOptions(o_Settings, key) {
    var data = o_Settings.options;
    $.each(key.split("."), function () {
        data = data[this]; // resurse through multiple levels
    });
    debugData(data, 'options.' + key);
}

/**
 * showState
 *
 * Pass a layout-options object, and the pane/key you want to display
 */
function showState(o_Settings, key) {
    debugData(o_Settings.state[key], 'state.' + key);
}


/**
 * createInnerLayout
 */
function createInnerLayout() {
    // innerLayout is INSIDE the center-pane of the outerLayout
    //debugData( layoutSettings_Inner );
    innerLayout = $(outerLayout.options.center.paneSelector).layout(layoutSettings_Inner);
    // hide 'Create Inner Layout' commands and show the list of testing commands
    $('#createInner').hide();
    $('#createInner2').hide();
    $('#innerCommands').show();
}

